Error Handling

Java Technologies - আরএক্সজাভা (RxJava)
133
133

RxJava তে, Error Handling বা ত্রুটি পরিচালনা একটি গুরুত্বপূর্ণ অংশ। অ্যাসিঙ্ক্রোনাস অপারেশনগুলিতে ত্রুটি ঘটার সম্ভাবনা থাকে, এবং সেগুলোর যথাযথভাবে মোকাবিলা করা প্রয়োজন। RxJava তে ত্রুটি পরিচালনা করার জন্য কিছু শক্তিশালী উপায় রয়েছে, যা ডেটা স্ট্রিমের মধ্যে ত্রুটি ঘটলে সেগুলোকে সঠিকভাবে হ্যান্ডল করতে সাহায্য করে।


Basic Error Handling

RxJava তে, Observable বা Observer যদি কোনো ত্রুটি (error) পায়, তবে তা একটি নির্দিষ্ট ফাংশনের মাধ্যমে হ্যান্ডল করা যায়। সাধারণত, onError() মেথডটি ত্রুটি ঘটলে কল হয়।

উদাহরণ:

Observable<Integer> observable = Observable.create(emitter -> {
    emitter.onNext(1);
    emitter.onNext(2);
    emitter.onError(new Throwable("Something went wrong"));
    emitter.onNext(3); // This won't be executed
});

observable.subscribe(
    item -> System.out.println("Item: " + item), 
    error -> System.out.println("Error: " + error.getMessage())
);

এখানে, onError() মেথডটি ত্রুটি ঘটলে কল হবে এবং পরবর্তীতে কোন ডেটা পাঠানো হবে না। আউটপুট হবে:

Item: 1
Item: 2
Error: Something went wrong

Retry Operator

RxJava তে, retry() অপারেশনটি ব্যবহার করে কোনো ত্রুটি ঘটলে পুনরায় চেষ্টা করতে পারেন। এটি অ্যাসিঙ্ক্রোনাস অপারেশনগুলোতে পুনরায় চেষ্টা করার সুবিধা দেয়, যেমন নেটওয়ার্ক রিকোয়েস্ট বা ডাটাবেজ কানেকশন। retry() সাধারণত একটি নির্দিষ্ট সংখ্যক সময় বা নির্দিষ্ট শর্তে পুনরায় চেষ্টা করতে ব্যবহৃত হয়।

উদাহরণ:

Observable<Integer> observable = Observable.create(emitter -> {
    emitter.onNext(1);
    emitter.onNext(2);
    emitter.onError(new Throwable("Something went wrong"));
});

observable.retry(2)
    .subscribe(
        item -> System.out.println("Item: " + item),
        error -> System.out.println("Error: " + error.getMessage())
    );

এখানে, retry(2) মেথডটি ত্রুটি ঘটলে ২ বার পুনরায় চেষ্টা করবে। আউটপুট হবে:

Item: 1
Item: 2
Error: Something went wrong

OnErrorReturn Operator

onErrorReturn() অপারেশনটি যখন কোনো ত্রুটি ঘটে, তখন এটি একটি ডিফল্ট মান প্রদান করে এবং ত্রুটি রিটার্ন না করে। এটি সাধারণত ত্রুটি ঘটে গেলে কার্যক্রম চালিয়ে যাওয়ার জন্য ব্যবহৃত হয়, যাতে সিস্টেমটি বন্ধ না হয়।

উদাহরণ:

Observable<Integer> observable = Observable.create(emitter -> {
    emitter.onNext(1);
    emitter.onNext(2);
    emitter.onError(new Throwable("Something went wrong"));
});

observable.onErrorReturn(throwable -> 0)
    .subscribe(
        item -> System.out.println("Item: " + item),
        error -> System.out.println("Error: " + error.getMessage())
    );

এখানে, onErrorReturn() মেথডটি ত্রুটি ঘটলে ডিফল্ট মান 0 প্রদান করবে। আউটপুট হবে:

Item: 1
Item: 2
Item: 0

OnErrorResumeNext Operator

onErrorResumeNext() অপারেশনটি একটি ত্রুটির পরে অন্য একটি Observable চালু করতে সাহায্য করে। এটি ত্রুটি ঘটলে নতুন একটি স্ট্রিম (Observable) প্রদান করতে ব্যবহৃত হয়, যা পরবর্তী কার্যক্রম চালিয়ে যায়।

উদাহরণ:

Observable<Integer> observable = Observable.create(emitter -> {
    emitter.onNext(1);
    emitter.onNext(2);
    emitter.onError(new Throwable("Something went wrong"));
});

observable.onErrorResumeNext(Observable.just(3, 4, 5))
    .subscribe(
        item -> System.out.println("Item: " + item),
        error -> System.out.println("Error: " + error.getMessage())
    );

এখানে, onErrorResumeNext() মেথডটি ত্রুটি ঘটলে Observable.just(3, 4, 5) চালু করবে। আউটপুট হবে:

Item: 1
Item: 2
Item: 3
Item: 4
Item: 5

DoOnError Operator

doOnError() অপারেশনটি ত্রুটি ঘটলে একটি ফাংশনকে কল করে। এটি মূলত লগিং বা ট্র্যাকিংয়ের জন্য ব্যবহৃত হয়, যখন আপনি শুধু ত্রুটির কথা জানাতে চান, কিন্তু স্ট্রিমের আচরণ পরিবর্তন করতে চান না।

উদাহরণ:

Observable<Integer> observable = Observable.create(emitter -> {
    emitter.onNext(1);
    emitter.onNext(2);
    emitter.onError(new Throwable("Something went wrong"));
});

observable.doOnError(error -> System.out.println("Logging error: " + error.getMessage()))
    .subscribe(
        item -> System.out.println("Item: " + item),
        error -> System.out.println("Error: " + error.getMessage())
    );

এখানে, doOnError() মেথডটি ত্রুটি ঘটলে শুধু লগ করবে, এবং পরে onError() ত্রুটি মেসেজটি প্রদর্শন করবে। আউটপুট হবে:

Logging error: Something went wrong
Item: 1
Item: 2
Error: Something went wrong

উপসংহার

RxJava তে Error Handling গুরুত্বপূর্ণ একটি অংশ, কারণ অ্যাসিঙ্ক্রোনাস অপারেশনে ত্রুটি ঘটার সম্ভাবনা বেশি থাকে। RxJava বিভিন্ন ধরনের অপারেশন যেমন retry(), onErrorReturn(), onErrorResumeNext(), ইত্যাদি প্রদান করে, যা ত্রুটি ঘটলে স্ট্রিমের আচরণ পরিবর্তন করতে সহায়তা করে। এগুলো প্রোগ্রামারকে ত্রুটি ম্যানেজমেন্টে আরও নমনীয়তা এবং কার্যকারিতা প্রদান করে।


Content added By

Error Handling এর ধারণা এবং এর প্রয়োজনীয়তা

99
99

RxJava একটি রিয়্যাক্টিভ প্রোগ্রামিং লাইব্রেরি, যেখানে ডেটা স্ট্রিমের মধ্যে বিভিন্ন ধরনের পরিবর্তন এবং সমস্যা ঘটতে পারে। এসব সমস্যা (যেমন, নেটওয়ার্কের সমস্যা, ডাটাবেসের সমস্যা, বা কোন আনপেডিক্টেবল এরর) পরিচালনা করার জন্য এরর হ্যান্ডলিং অত্যন্ত গুরুত্বপূর্ণ। RxJava তে এরর হ্যান্ডলিং খুবই শক্তিশালী এবং নমনীয়, যা প্রোগ্রামারকে নিরাপদ এবং কার্যকরী অ্যাসিঙ্ক্রোনাস কোড লেখার সুযোগ প্রদান করে।


এরর হ্যান্ডলিংয়ের ধারণা

RxJava তে, যখন কোনো ত্রুটি বা এরর ঘটে, তখন তা সাধারণত Observable এর মাধ্যমে রিপোর্ট করা হয়। অবজারভার (observer) তখন এররটি গ্রহণ করে এবং প্রোগ্রামটি থামানো বা চালিয়ে যাওয়া সিদ্ধান্ত নিতে পারে।

RxJava তে এরর হ্যান্ডলিংয়ের জন্য কয়েকটি গুরুত্বপূর্ণ কনসেপ্ট রয়েছে:

  • onError(): এটি হল একটি ফাংশন যা Observable থেকে আসা এরর গ্রহণ করে। যখন কোনো ত্রুটি ঘটে, তখন এটি কল হয়।
  • onErrorResumeNext(): এটি ব্যবহার করে একটি বিকল্প Observable প্রদান করা যায়, যা ত্রুটি ঘটলে চালু হয়ে নতুন ডেটা প্রদান করতে পারে।
  • retry(): এটি ত্রুটি ঘটলে স্বয়ংক্রিয়ভাবে পুনরায় চেষ্টা করার ব্যবস্থা করে।
  • onExceptionResumeNext(): এটি একটি নির্দিষ্ট এক্সেপশন ঘটলে অন্য Observable দিয়ে এটি চালিয়ে যেতে পারে।

আরএক্সজাভায় এরর হ্যান্ডলিংয়ের প্রয়োজনীয়তা

  1. অ্যাসিঙ্ক্রোনাস অপারেশনের নিরাপত্তা: অ্যাসিঙ্ক্রোনাস কোডে যখন একাধিক সার্ভিস বা সিস্টেমের সাথে যোগাযোগ হয়, তখন কোন একটি সিস্টেমে ত্রুটি ঘটলে পুরো সিস্টেমে সমস্যা তৈরি হতে পারে। এরর হ্যান্ডলিং-এর মাধ্যমে এমন পরিস্থিতি মোকাবেলা করা যায়, যাতে এক সার্ভিসের ত্রুটি অন্য সার্ভিস বা অপারেশনগুলোর উপর প্রভাব না ফেলে।
  2. কোডের স্থায়িত্ব: কোডের স্থায়িত্ব নিশ্চিত করতে হলে, অ্যাসিঙ্ক্রোনাস অপারেশনগুলির জন্য শক্তিশালী এরর হ্যান্ডলিং ব্যবস্থা থাকা প্রয়োজন। ত্রুটি সঠিকভাবে হ্যান্ডল করলে প্রোগ্রামটি সম্পূর্ণভাবে ক্র্যাশ না করে সঠিকভাবে চালু থাকতে পারে।
  3. ব্যবহারকারী অভিজ্ঞতা (UX): ত্রুটি সঠিকভাবে হ্যান্ডল করলে ব্যবহারকারী কোনও বিরক্তি ছাড়া আরও ভালো অভিজ্ঞতা পেতে পারেন। যেমন, নেটওয়ার্কের ত্রুটি হলে, ব্যবহারকারীকে একটি পরিষ্কার বার্তা দেওয়া যেতে পারে যাতে তারা জানে ত্রুটির কারণ কী এবং এটি সাময়িকভাবে সমাধান করা হবে।
  4. ডিবাগিং সহজতর করা: ত্রুটির যথাযথ হ্যান্ডলিংয়ের মাধ্যমে প্রোগ্রামাররা দ্রুত এবং সহজে সমস্যাটি চিহ্নিত করতে পারেন। এরর লোগিং বা রিটার্ন করার পদ্ধতি ব্যবহার করে ত্রুটি শনাক্তকরণ সহজ হয়।

আরএক্সজাভায় এরর হ্যান্ডলিং উদাহরণ

ধরা যাক, একটি নেটওয়ার্ক রিকোয়েস্ট পাঠানোর পর যদি কোনো ত্রুটি ঘটে, তবে সেটা হ্যান্ডল করার জন্য একটি উদাহরণ নিচে দেওয়া হলো:

Observable<String> networkRequest = Observable.create(emitter -> {
    // কিছু নেটওয়ার্ক অপারেশন এখানে
    if (/* কোনো ত্রুটি ঘটে */) {
        emitter.onError(new Throwable("Network Error"));
    }
});

networkRequest
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .onErrorResumeNext(throwable -> {
        // বিকল্প Observable প্রদান করা যা ত্রুটি ঘটলে চালু হবে
        return Observable.just("Default Data");
    })
    .subscribe(
        data -> {
            // সঠিক ডেটা প্রক্রিয়া করা
        },
        error -> {
            // ত্রুটি হ্যান্ডল করা
            Log.e("RxJava", "Error: " + error.getMessage());
        }
    );

এখানে, onErrorResumeNext() এর মাধ্যমে ত্রুটি ঘটলে একটি ডিফল্ট ডেটা প্রদান করা হচ্ছে।


সারাংশ

RxJava তে শক্তিশালী এরর হ্যান্ডলিং ব্যবস্থা থাকলে অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং আরও কার্যকরী, স্থিতিশীল এবং ব্যবহারকারী-বান্ধব হয়। এরর হ্যান্ডলিংয়ের মাধ্যমে ত্রুটির সম্মুখীন হলে কোড সহজে পুনরুদ্ধার করা যায়, যা সফটওয়্যার ডেভেলপমেন্টে একটি গুরুত্বপূর্ণ বিষয়।

Content added By

onErrorReturn(), onErrorResumeNext(), এবং retry() এর ব্যবহার

122
122

আরএক্সজাভা (RxJava) তে ডেটা স্ট্রিম প্রসেস করার সময় বিভিন্ন ধরনের এরর (error) ঘটতে পারে। এই ধরনের পরিস্থিতি মোকাবেলা করার জন্য RxJava কিছু গুরুত্বপূর্ণ অপারেশন প্রদান করে, যেমন onErrorReturn(), onErrorResumeNext(), এবং retry()। এগুলি ব্যবহার করে আমরা ইরর হ্যান্ডলিং এবং ডেটা স্ট্রিম পুনরায় চেষ্টা করতে পারি।


onErrorReturn()

onErrorReturn() একটি অপারেশন যা একটি এরর ঘটলে কাস্টম ভ্যালু রিটার্ন করে। যখন কোনো Observable তে এরর ঘটে, তখন এটি অবিলম্বে একটি নির্দিষ্ট ভ্যালু ফেরত পাঠায় এবং স্ট্রিমের পরবর্তী অংশে এগোতে থাকে। এটি শুধুমাত্র একটি কাস্টম ফলাফল দিয়ে স্ট্রিমটি শেষ করতে সাহায্য করে।

ব্যবহার

Observable<Integer> observable = Observable.create(emitter -> {
    emitter.onNext(1);
    emitter.onNext(2);
    emitter.onError(new Throwable("Something went wrong"));
});

observable
    .onErrorReturn(throwable -> -1)  // Default value when error occurs
    .subscribe(
        item -> System.out.println("Received: " + item),
        throwable -> System.out.println("Error: " + throwable)
    );

এখানে, যদি কোন এরর ঘটে, তবে -1 ভ্যালু রিটার্ন করা হবে।


onErrorResumeNext()

onErrorResumeNext() একটি অপারেশন যা একটি এরর ঘটলে একটি নতুন Observable কে স্যুইচ করে দেয়। অর্থাৎ, যখন কোনো Observable তে এরর ঘটে, তখন এটি একটি নতুন স্ট্রিম শুরু করে, যেখানে আপনি আবার নতুন ডেটা প্রাপ্তি শুরু করতে পারেন। এটি onErrorReturn() এর চেয়ে আরও বেশি ফ্লেক্সিবল কারণ এটি সম্পূর্ণ নতুন ডেটা স্ট্রিম প্রদান করে।

ব্যবহার

Observable<Integer> observable = Observable.create(emitter -> {
    emitter.onNext(1);
    emitter.onNext(2);
    emitter.onError(new Throwable("Something went wrong"));
});

observable
    .onErrorResumeNext(Observable.just(100, 200))  // Switch to a new Observable when error occurs
    .subscribe(
        item -> System.out.println("Received: " + item),
        throwable -> System.out.println("Error: " + throwable)
    );

এখানে, যদি কোন এরর ঘটে, তাহলে 100 এবং 200 সংখ্যাগুলি একটি নতুন স্ট্রিম থেকে রিটার্ন হবে।


retry()

retry() অপারেশনটি একটি শক্তিশালী মেকানিজম যা একটি এরর ঘটলে পুনরায় চেষ্টা করার (retry) সুযোগ প্রদান করে। এটি একাধিক বার চেষ্টা করতে পারে নির্দিষ্ট পরিমাণে অথবা একদম অসীম পরিমাণে, যতবার না ডেটা সফলভাবে পাঠানো হয়। retry() সাধারণত নেটওয়ার্ক সম্পর্কিত ত্রুটি (error) বা অস্থায়ী সমস্যা ম্যানেজ করার জন্য ব্যবহৃত হয়।

ব্যবহার

Observable<Integer> observable = Observable.create(emitter -> {
    emitter.onNext(1);
    emitter.onNext(2);
    emitter.onError(new Throwable("Network error"));
});

observable
    .retry(3)  // Retry up to 3 times if an error occurs
    .subscribe(
        item -> System.out.println("Received: " + item),
        throwable -> System.out.println("Error: " + throwable)
    );

এখানে, যদি প্রথমবার এরর ঘটে, তবে এটি ৩ বার পর্যন্ত পুনরায় চেষ্টা করবে এবং তারপর ত্রুটি বার্তা প্রদর্শিত হবে।


উপসংহার

RxJava তে onErrorReturn(), onErrorResumeNext(), এবং retry() অপারেশনগুলি খুবই কার্যকরী। onErrorReturn() এর মাধ্যমে আপনি একটি কাস্টম ভ্যালু রিটার্ন করতে পারেন, onErrorResumeNext() নতুন স্ট্রিম ব্যবহার করতে সহায়ক, এবং retry() পুনরায় চেষ্টা করার জন্য উপযোগী। এগুলোর মাধ্যমে আপনি আরও শক্তিশালী এবং রিয়্যাকটিভ অ্যাপ্লিকেশন তৈরি করতে পারবেন, যেখানে ডেটার ত্রুটি বা ব্যর্থতার সত্ত্বেও অ্যাপ্লিকেশন চলমান থাকতে পারে।


Content added By

Error Handling এর জন্য Best Practices

100
100

আরএক্সজাভা (RxJava) তে এরর হ্যান্ডলিং অত্যন্ত গুরুত্বপূর্ণ, কারণ অ্যাসিঙ্ক্রোনাস অপারেশন চলাকালীন অনেক ধরনের ত্রুটি (error) ঘটতে পারে। সঠিকভাবে এরর হ্যান্ডলিং না করলে সিস্টেমে অপ্রত্যাশিত আচরণ বা ক্র্যাশ হতে পারে। এই কারণে, আরএক্সজাভা তে এরর হ্যান্ডলিংয়ের জন্য কিছু প্র্যাকটিস রয়েছে, যা অ্যাপ্লিকেশনের স্থিতিশীলতা এবং নির্ভরযোগ্যতা নিশ্চিত করতে সাহায্য করে।


আরএক্সজাভা (RxJava) তে এরর হ্যান্ডলিং এর Best Practices

১. Try-Catch ব্লক ব্যবহার না করা

আরএক্সজাভাতে সাধারণভাবে try-catch ব্লক ব্যবহার করা হয় না, কারণ এটি স্ট্রিম ভিত্তিক আর্কিটেকচারে প্রাকৃতিকভাবে মানানসই নয়। বরং, RxJava তে এরর হ্যান্ডলিংয়ের জন্য নির্দিষ্ট অপারেটর রয়েছে যেগুলি স্ট্রিমের মধ্যে ঘটে যাওয়া ত্রুটিকে সঠিকভাবে হ্যান্ডেল করতে সাহায্য করে।

২. OnErrorReturn এবং OnErrorResumeNext ব্যবহার করা

onErrorReturn এবং onErrorResumeNext হল দুটি গুরুত্বপূর্ণ অপারেশন যা অ্যাপ্লিকেশনকে তার কাজ অব্যাহত রাখতে সাহায্য করে যখন কোনো ত্রুটি ঘটে। এগুলি ব্যবহার করা যায় যদি আপনি ত্রুটির পরেও স্ট্রিমের প্রবাহ বজায় রাখতে চান।

  • onErrorReturn: এটি একটি ডিফল্ট ভ্যালু ফেরত দেয় যখন কোনো ত্রুটি ঘটে, যাতে স্ট্রিম চলতে থাকে।
  • onErrorResumeNext: এটি একাধিক Observable স্ট্রিমে একটি নতুন স্ট্রিম সরবরাহ করে, যাতে বর্তমান স্ট্রিমটি ভেঙে না পড়ে।
observable
    .onErrorReturn(throwable -> "Default Value")
    .subscribe(System.out::println);

৩. Retry এবং RetryWhen ব্যবহার করা

RxJava তে retry এবং retryWhen অপারেটর ব্যবহার করা হয় পুনরায় চেষ্টা করার জন্য, বিশেষ করে যখন আপনি জানেন যে ত্রুটি সাময়িক এবং একাধিক চেষ্টা সফল হতে পারে।

  • retry: এটি একটি নির্দিষ্ট সংখ্যক বার ত্রুটি ঘটলে পুনরায় স্ট্রিমটি চালিয়ে দেয়।
  • retryWhen: এটি একটি কাস্টম লজিক প্রদান করে, যার মাধ্যমে পুনরায় চেষ্টা করার জন্য শর্ত তৈরি করা যায়।
observable
    .retry(3)  // ৩ বার retry করবে
    .subscribe(System.out::println);

৪. Error Notification ব্যবহার করা

onError অপারেশনটি সাধারণত ত্রুটি সম্পর্কে নোটিফিকেশন পাঠাতে ব্যবহৃত হয়। এটি আপনাকে অবজার্ভারে ত্রুটি ঘটলে অবহিত করে, যাতে আপনি তা হ্যান্ডেল করতে পারেন।

observable
    .doOnError(throwable -> System.out.println("Error occurred: " + throwable.getMessage()))
    .subscribe(System.out::println, Throwable::printStackTrace);

৫. সঠিক Error Types ব্যবহার করা

যখন আপনি নিজের কাস্টম Exception তৈরি করেন, তখন সেগুলি সঠিকভাবে ব্যবহার করতে হবে। সাধারণত, RxJava তে কাস্টম এরর টাইপ ব্যবহার করা হয়, যাতে আপনি বিভিন্ন ধরণের ত্রুটির জন্য নির্দিষ্ট হ্যান্ডলিং ব্যবস্থা গ্রহণ করতে পারেন।

৬. CompositeDisposable ব্যবহার করা

আরএক্সজাভা তে অনেক অপারেশন একসাথে চলতে পারে, আর একাধিক Disposable এর মধ্যে কখনও কখনও ত্রুটি হতে পারে। CompositeDisposable ব্যবহার করে একাধিক Disposable কে একত্রিত করে আপনি সহজে তাদের ম্যানেজ করতে পারবেন এবং একযোগে বন্ধ করতে পারবেন।

CompositeDisposable compositeDisposable = new CompositeDisposable();
compositeDisposable.add(observable.subscribe());
compositeDisposable.clear();

উপসংহার

আরএক্সজাভাতে সঠিকভাবে এরর হ্যান্ডলিং করা একটি গুরুত্বপূর্ণ দিক, কারণ এটি আপনার অ্যাপ্লিকেশনের স্থিতিশীলতা এবং কার্যকারিতা বজায় রাখতে সাহায্য করে। এরর হ্যান্ডলিংয়ের জন্য বিভিন্ন অপারেটরের ব্যবহার যেমন onErrorReturn, retry, onErrorResumeNext, এবং CompositeDisposable নিশ্চিত করে যে, আপনার অ্যাপ্লিকেশন দক্ষভাবে ত্রুটির মোকাবেলা করতে সক্ষম।


Content added By

উদাহরণ সহ Error Handling

122
122

আরএক্সজাভা (RxJava) তে ডেটা স্ট্রিম পরিচালনার সময় বিভিন্ন ধরনের এরর (Error) ঘটতে পারে। এরর হ্যান্ডলিং একটি গুরুত্বপূর্ণ বিষয়, যা আপনাকে কার্যকরী ও স্থিতিশীল অ্যাপ্লিকেশন তৈরি করতে সাহায্য করে। RxJava তে এরর হ্যান্ডলিং করার জন্য বেশ কিছু অপারেশন এবং কৌশল রয়েছে, যা আমরা উদাহরণের মাধ্যমে ব্যাখ্যা করব।


RxJava তে Error Handling এর প্রধান কৌশলসমূহ

1. onError Callback

onError হল একটি কলব্যাক যা যখন কোনো এরর ঘটে তখন ট্রিগার হয়। আপনি এই কলব্যাকের মাধ্যমে এরর হ্যান্ডলিং করতে পারেন। এটি Observable এর মধ্যে ঘটে এমন কোনো ব্যতিক্রম বা ত্রুটি (exception) ক্যাচ (catch) করতে ব্যবহৃত হয়।

2. onErrorReturn

onErrorReturn অপারেশনটি ব্যবহার করে, আপনি একটি বিকল্প মান প্রদান করতে পারেন যখন কোনো এরর ঘটে। এটি Observable এ যদি কোনো এরর ঘটে, তাহলে ডিফল্ট মান ফেরত দেয়।

3. onErrorResumeNext

onErrorResumeNext অপারেশনটি তখন ব্যবহার হয় যখন একটি Observable তে এরর ঘটে, এবং আপনি এটি এড়িয়ে অন্য একটি Observable থেকে ডেটা নেওয়ার সিদ্ধান্ত নেন।


উদাহরণ সহ Error Handling

এখানে একটি উদাহরণ দেওয়া হলো যেখানে আমরা RxJava তে এরর হ্যান্ডলিং করি:

import io.reactivex.rxjava3.core.Observable;

public class RxJavaErrorHandlingExample {
    public static void main(String[] args) {
        
        // একটি Observable তৈরি করা হচ্ছে যা একটি ভুল (Exception) তৈরি করবে
        Observable<Integer> numbers = Observable.create(emitter -> {
            emitter.onNext(1);
            emitter.onNext(2);
            emitter.onError(new RuntimeException("Something went wrong!"));
            emitter.onNext(3); // এই অংশটি কখনও execute হবে না কারণ এরর হয়ে গেছে
        });

        // Error Handling with onErrorReturn
        numbers
            .onErrorReturn(throwable -> {
                System.out.println("Error occurred: " + throwable.getMessage());
                return -1; // error হলে -1 ফেরত দিবে
            })
            .subscribe(
                item -> System.out.println("Item: " + item),
                throwable -> System.out.println("Error: " + throwable),  // এই অংশটি এখন আর কাজ করবে না
                () -> System.out.println("Completed!")
            );
    }
}

এই উদাহরণটির ব্যাখ্যা

  1. প্রথমে একটি Observable তৈরি করা হয়েছে যা প্রথম দুটি ভ্যালু প্রেরণ করবে (onNext) এবং তারপরে একটি RuntimeException ঘটাবে (onError), এর ফলে পরবর্তী onNext কলটি কার্যকরী হবে না।
  2. onErrorReturn ব্যবহার করে, যদি কোনো এরর ঘটে, তাহলে -1 মানটি ফেরত দেয়া হবে এবং এরর বার্তা প্রদর্শিত হবে।
  3. subscribe মেথডে দুটি কলব্যাক (যেমন onNext, onError, এবং onComplete) ব্যবহার করা হয়েছে, তবে এখানে এরর ঘটবে বলে onError কলব্যাকটি কার্যকরী হবে।

onErrorResumeNext এর উদাহরণ

এখন একটি উদাহরণ দিচ্ছি যেখানে onErrorResumeNext অপারেশনটি ব্যবহার করা হয়েছে। এখানে যদি কোনো ত্রুটি ঘটে, তাহলে অন্য একটি Observable এর ডেটা ব্যবহার করা হবে।

import io.reactivex.rxjava3.core.Observable;

public class RxJavaOnErrorResumeNextExample {
    public static void main(String[] args) {
        
        // একটি Observable তৈরি করা হচ্ছে যা একটি ভুল (Exception) তৈরি করবে
        Observable<Integer> numbers = Observable.create(emitter -> {
            emitter.onNext(1);
            emitter.onNext(2);
            emitter.onError(new RuntimeException("Something went wrong!"));
        });

        // Error Handling with onErrorResumeNext
        Observable<Integer> fallback = Observable.just(10, 20, 30);

        numbers
            .onErrorResumeNext(fallback)  // এরর হলে fallback Observable চালু হবে
            .subscribe(
                item -> System.out.println("Item: " + item),
                throwable -> System.out.println("Error: " + throwable),
                () -> System.out.println("Completed!")
            );
    }
}

ব্যাখ্যা

  1. numbers নামের একটি Observable প্রথমে কিছু ভ্যালু পাঠায়, তারপর একটি ত্রুটি তৈরি করে।
  2. onErrorResumeNext ব্যবহার করে, ত্রুটি ঘটলে fallback নামের আরেকটি Observable চালু হবে, যা 10, 20, 30 পাঠাবে।
  3. subscribe মেথডে, এখন যদি কোনো ত্রুটি ঘটে, তাহলে প্রথম Observable এর পরিবর্তে fallback Observable এর ডেটা ব্যবহার করা হবে।

উপসংহার

RxJava তে এরর হ্যান্ডলিং অত্যন্ত সহজ এবং শক্তিশালী। onError, onErrorReturn, এবং onErrorResumeNext অপারেশনগুলির মাধ্যমে আপনি আপনার অ্যাসিঙ্ক্রোনাস স্ট্রিমে এররগুলো সুন্দরভাবে হ্যান্ডল করতে পারেন। এগুলো ব্যবহারের মাধ্যমে আপনার কোডে স্থিতিশীলতা এবং ইউজার-ফ্রেন্ডলি অভিজ্ঞতা নিশ্চিত করা সম্ভব।


Content added By
Promotion